僅記錄在找 format string in Ruby 時,對 % 和sprintf
產生的疑問和查詢的過程。
首先,從Ruby 的官方文件開始:
Format - Uses str as a format specification, and returns the result of applying it to arg. If the format specification contains more than one substitution, then arg must be an Array or Hash containing the values to be substituted. See Kernel::sprintf for details of the format string.
老樣子,英文字太多,就分段一個一個來:
"%05d" % 123 #=> "00123"
"%-5s: %016x" % [ "ID", self.object_id ] #=> "ID : 00002b054ec93168"
"foo = %{foo}" % { :foo => 'bar' } #=> "foo = bar"
str % arg #=> result
“format specification” % arg( as target ) #=> result( what you expect to )
格式規範 % arg #=> 結果
所以,%是用來格式化文字的,會依據妳所使用的 format specification (格式規範)。
很好,新的問題來了:什麼是 format specification?有哪些 type?
要回答上面的問題之前,得先在進步查一下Kernel::sprintf
在API裡寫了什麼:
Returns the string resulting from applying format_string to any additional arguments. Within the format string, any characters other than format sequences are copied to the result.
The syntax of a format sequence is follows.
%[flags][width][.precision]type
A format sequence consists of a percent sign, followed by optional flags, width, and precision indicators, then terminated with a field type character. The field type controls how the corresponding sprintf argument is to be interpreted, while the flags modify that interpretation.
姆姆,果然是這樣,和我想的一樣呢!說人話啊渾球!!
為了方便理解和查詢,姑且稍微整理一下吧!
Field type | Integer Format | 請給我中文 |
---|---|---|
b (or B) | binary number | 2進位數字 |
d (or i or u) | decimal number | 10進位數字 |
o | octal number | 8進位數字 |
x (or X) | hexadecimal number | 16進位數字 |
Field type | Float Format | 請給我中文 |
---|---|---|
e(or E) | exponential notation | 科學計算表示 |
f | float | 浮點數 |
Field type | Other Format | 請給我中文 |
---|---|---|
s | string | 字串 |
#沒有設定flag
"%d" % 123 #=> "123"
#設定+作為flag
"%+d" % 123 #=> "+123"
#設定 作為flag
"% d" % 123 #=> " 123"
"%.0f" % 1234 #=> "1234"
#設定#作為flag,用來強制產生小數點
"%#.0f" % 1234 #=> "1234."
"%+20d" % 123 #=> " +123"
"%-20d" % 123 #=> "123 "
大概就是這樣...
其實,直接看官方文件比較快的說...
啊哈哈哈,剛剛發現自己昨天鐵人賽的文章還放在草稿沒發出去時,
真想掐死昨天的自己啊...囧
嘛,雖然沒辦法連續30天發文,但還是要逼自己繼續下去。
鐵人賽,我會繼續撐下去的!!
參考資料: